package com.ynet.middleground.contract.service.impl;

import java.util.List;

import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import com.google.common.base.Throwables;
import com.ynet.core.common.ServiceResult;
import com.ynet.core.exception.BusinessException;
import com.ynet.core.log.IfpLogger;
import com.ynet.middleground.contract.bean.AddTemplateTableParamsReq;
import com.ynet.middleground.contract.bean.DeleteTemplateTableParamReq;
import com.ynet.middleground.contract.bean.QueryTemplateTableParamsReq;
import com.ynet.middleground.contract.bean.UpdateTemplateTableParamReq;
import com.ynet.middleground.contract.dto.TemplateTableParamDTO;
import com.ynet.middleground.contract.model.TemplateTableParamModel;
import com.ynet.middleground.contract.service.TemplateTableParamService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;

/**
 * @author liulx
 * @description 模板表格单元格参数处理
 * @date 2020-04-03 14:46
 */
@Produces({MediaType.APPLICATION_JSON + "; " + "charset=UTF-8"})
@Consumes({MediaType.APPLICATION_JSON + "; " + "charset=UTF-8"})
@Api(value = "模板表格单元格参数服务", tags = {"模板表格单元格参数服务"})
@Path("table-param")
@Service(timeout = 6000, version = "0.0.1")
public class TemplateTableParamsServiceImpl implements TemplateTableParamService, GenericService {

    @Autowired
    private TemplateTableParamModel templateTableParamModel;

    /**
     * 根据表格 id 查询表格单元格参数列表
     *
     * @param queryTemplateTableParamsReq 查询模板表格的参数信息请求类
     * @return 表格单元格参数列表
     */
    @POST
    @Path("list")
    @ApiOperation(value = "查询表格单元格参数列表", notes = "根据表格 id 查询表格单元格参数列表<br />该服务辅佐于维护模板信息，可用于单独维护模板参数中的表格类型参数")
    @ApiImplicitParam(name = "requestObj", dataType = "QueryTemplateTableParamsReq", paramType = "body",
        required = true)
    @Override
    public ServiceResult<List<TemplateTableParamDTO>>
        listTemplateTableParamsByTableId(QueryTemplateTableParamsReq queryTemplateTableParamsReq) {
        ServiceResult<List<TemplateTableParamDTO>> result = new ServiceResult<>();
        try {
            List<TemplateTableParamDTO> list =
                templateTableParamModel.listTemplateTableParamsByTableId(queryTemplateTableParamsReq);
            result.setResult(list);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "查询表格单元格参数列表服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 新增表格参数信息
     *
     * @param addTemplateTableParamsReq 新增模板表格单元格参数请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @POST
    @ApiOperation(value = "新增表格参数信息", notes = "为指定表格添加单元格参数信息，如果是已停用的模板会生成新的模板版本<br />该服务辅佐于维护模板信息，可用于单独维护模板参数中的表格类型参数")
    @ApiImplicitParam(name = "requestObj", dataType = "AddTemplateTableParamsReq", paramType = "body", required = true)
    @Override
    public ServiceResult addTemplateTableParams(@Valid AddTemplateTableParamsReq addTemplateTableParamsReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateTableParamModel.addTemplateTableParams(addTemplateTableParamsReq);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "新增表格参数信息服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 根据表格参数 id 修改参数信息
     *
     * @param updateTemplateTableParamReq 修改模板表格参数信息请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @PUT
    @ApiOperation(value = "修改表格参数信息", notes = "修改表格中某一单元格参数信息，如果是已停用的模板会生成新的模板版本<br />该服务辅佐于维护模板信息，可用于单独维护模板参数中的表格类型参数")
    @ApiImplicitParam(name = "requestObj", dataType = "UpdateTemplateTableParamReq", paramType = "body",
        required = true)
    @Override
    public ServiceResult updateTemplateTableParamById(@Valid UpdateTemplateTableParamReq updateTemplateTableParamReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateTableParamModel.updateTemplateTableParamById(updateTemplateTableParamReq, false);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "修改表格参数信息服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

    /**
     * 根据表格参数 id 删除指定表格参数信息
     *
     * @param deleteTemplateTableParamReq 删除模板表格参数请求类
     * @return 结果标志，以 success 字段值标识 true/false
     */
    @DELETE
    @ApiOperation(value = "删除表格参数信息", notes = "删除表格中某一单元格参数信息，如果是已停用的模板会生成新的模板版本<br />该服务辅佐于维护模板信息，可用于单独维护模板参数中的表格类型参数")
    @ApiImplicitParam(name = "requestObj", dataType = "DeleteTemplateTableParamReq", paramType = "body",
        required = true)
    @Override
    public ServiceResult deleteTemplateTableParamById(@Valid DeleteTemplateTableParamReq deleteTemplateTableParamReq) {
        ServiceResult result = new ServiceResult<>();
        try {
            templateTableParamModel.deleteTemplateTableParam(deleteTemplateTableParamReq);
        } catch (BusinessException be) {
            result.setError(be.getCode(), be.getMessage());
        } catch (Exception e) {
            IfpLogger.error(Thread.currentThread().getStackTrace()[1].getMethodName(), "删除表格参数信息服务异常, case: {}",
                Throwables.getStackTraceAsString(e));
            result.setError("ECCT0000", "服务异常，请联系系统管理员");
        }
        return result;
    }

}
